opengl版本发展史及各种概念的厘清

您所在的位置:网站首页 opengl和opengles 哪个效率高 opengl版本发展史及各种概念的厘清

opengl版本发展史及各种概念的厘清

2023-09-19 06:08| 来源: 网络整理| 查看: 265

1、版本发展

1 opengl的版本区别1.1 opengl1.1        1995年,SGI推出了更为完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。1.2 opengl1.3       2001年8月,ARB发布OpenGL 1.3规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。 1.3 opengl1.4      2002年7月,ARB正式发布OpenGL 1.4,它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。 1.3 opengl1.5      2003年的7月,ARB公布OpenGL 1.5规范。OpenGL 1.5内包含ARB制定的“正式扩展规格绘制语言”(OpenGL Shading Language v1.0),该语言用于着色对象、顶点着色、片断着色等扩展功能,同时也将作为下一代OpenGL 2.0版本的内核。OpenGL 1.5的变化还增加了顶点缓冲对象(可提高透视性能)、非乘方纹理(可提高纹理内存的使用效率)以及阴影功能、隐蔽查询功能等等。其主要内容包括

 顶点Buffer Object:进行顶点配列方式可以提高透视性能Shadow功能:增加用来比较Shadow映射的函数 隐蔽查询(QUERY):为提高Curling性能采用非同步隐蔽测试非乘方纹理(Texture):提高mipmap等纹理内存的使用效率 OpenGL Shading Language v.1.0:用于着色(shader)对象、顶点着色以及片断着色技术(fragment shader )的扩展功能 

1.4 opengl2.0     OpenGL 1.0推出后的相当长的一段时间里,OpenGL唯一做的只是增加了一些扩展指令集,这些扩展指令是一些绘图功能,像是ClearCoat、Multisample、视频及绘图的整合工具(某些是通过OpenML的努力而开发出来的,它本身属于OpenGL ARB扩展指令之一。OpenGL 2.0将在OpenGL 1.3基础上进行修改扩充、但它将有下面五个方面的重大改进:①复杂的核心被彻底精简;②完全的硬件可编程能力;③改进的内存管理机制、支持高级像素处理;④扩展至数字媒体领域,使之跨越高端图形和多媒体范畴;⑤支持嵌入式图形应用。为了在获得强大功能的同时保持理想的兼容性,OpenGL 2.0又经历以下两个发展阶段:第一个阶段注重兼容能力和平滑过渡,为此,OpenGL 2.0核心将在精简后的OpenGL 1.3功能模块的基础上加上可完全兼容的新功能共同组成,这种做法在满足兼容性的同时,还可将原有OpenGL中数量众多、且相互纠缠不清的扩展指令进行彻底精简。 第一阶段的任务只是为了过渡,而第二阶段才是OpenGL 2.0的真正成熟期。此时,ARB将合成出一个“纯OpenGL 2.0”内核,纯内核将包含更多新增加的“精简型API函数”,这些函数具有完全的可编程特性、结构简单高效、功能强大且应用灵活。除了完成这项任务外,ARB组织还得指导开发商抛弃繁琐的OpenGL 1.X、转用更具弹性的“纯OpenGL 2.0”。 

1.5 opengl3.0及opengl3.1

        OpenGL3.0规范已于2008年8月发布,OpenGL3.0于微软DirectX 10有不少相近之处du,比如增加几何着色渲染,整数指令集,统一缓存,原生支持非线性色彩空间等,而且需要DirectX 10级别的显卡支持。与之不同的是,OpenGL3.0具有较强的跨平台运行优势,它不仅能运行在Windows Vista系统上没,还能运行在Windows XP甚至是Linux平台上。相对于DirectX 10只能在Windows Vista上运行,这确实是一个不小的优势。

       在OpenGL 3.0规范发布七个多月之后,Khronos Group今天又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。OpenGL 3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。

OpenGL 3.1主要新特性:

Texture Buffer Objects(纹理缓冲对象)、Uniform Buffer Objects(统一缓冲对象)、Signed Normalized Textures(符号正常化纹理)、Primitive Restart(基本元素重启)、Instancing(实例化)、CopyBuffer API(拷贝缓冲接口)……

与OpenGL 3.1规范同步,OpenGL架构评审委员会(ARB)也发布了一个兼容性扩展,能让开发人员在访问OpenGL 3.1里已经删除的OpenGL 1.x/2.x功能,确保应用程序的全面向下兼容性。OpenGL 3.1公布后,业界图形厂商很快予以了大力支持。

1.6 OpenGL 4.0 :

        时间来到2010年三月,这个版本和OpenGL 3.3同时发布,增加了令人兴奋的Tessellation Shader;Shader Language 4.00的subroutine提供了在运行时刻不需要切换着色器或者是重新编译或者使用if判断选择不同功能的方法,降低了切换着色器程序所带来的巨大开销(切换着色器的CPU循环消耗真的非常的惊人);另外GL_ARB_draw_buffers_blend让fragment shader输出的每条buffer都可以完成各自的pre-fragment operaion,而不是像过去那样每条都完成相同的pre-fragment operation;GL_ARB_transform_feedback2和GL_ARB_transform_feedback3提供了transform feedback object,以及transform feedback相关的控制(比如pause之类),也把transform feedback当做一个对象来进行处理。

主要的新功能包括

新的着色阶段,可以由GPU进行几何嵌饰(tessellation),减轻CPU负担每采样片段着色器,及可编程的片段着色器输入位置,提升了渲染质量和保真灵活性可以绘制OpenCL和自身生成的数据,无需CPU干预着色子例程,显著提升编程灵活性通过新增的采样对象(sampler object)将纹理状态和纹理数据分离在着色中支持64位双精度浮点数性能上的改善,包括实例化几何着色器、实例化数组和新的计 时器查询

1.7 OpenGL 4.6 

        2017年,Khronos Group标准组织终于将OpenGL标准规范从4.5版升级到了4.6版——版本号变化不大,但新东西还是很多的。OpenGL 4.6的最大变化就是支持SPIR-V,一种用于GPU通用计算和图形学的中间语言,Khronos开发设计,最初是为OpenCL规范准备的,和下一代图形标准Vulkan差不多同时提出,也在不断发展完善。OpenGL 4.6标准将SPIR-V着色器整合在了核心规范中,可以确保得到广泛的支持。同时,新标准还增加了大量的ARB、EXT扩展,包括GL_ARB_gl_spirv、GL_ARB_indirect_parameters、GL_ARB_pipeline_statistics_query、GL_ARB_texture_filter_anisotropic、GL_ARB_polygon_offset_clamp、GL_ARB_shader_atomic_counter_ops、GL_KHR_no_error、GL_KHR_parallel_shader_compile、WGL_ARB_create_context_no_error、GXL_ARB_create_context_no_error。这些扩展由Khronos、AMD、Intel、NVIDIA联合创建,会得到各家显卡的普遍支持。此外,OpenGL标准一如既往地开放,OpenGL、OpenGL ES都新增了不少可以与DirectD、Vulkan合作、互通的扩展,包括GL_EXT_memory_object、GL_EXT_memory_object_fd、GL_EXT_memory_object_win32、GL_EXT_semaphore、GL_EXT_semaphore_fd、GL_EXT_semaphore_win32、GL_EXT_win32_keyed_mutex。

 

2、OpenGL 基本概念

opengl的学习资料比较散乱,初学者常常被各类概念和缩写弄得头晕眼花,就算是广为流传的《red book》 《编程指南》也对这些概念一笔带过。本文打算先梳理一些常见的概念、词汇,为后面的学习扫除障碍。

OpenGLES 与 EGL 

通过osg来学习opengl的同学,是不是一开始就被cmake的界面上一堆的陌生编译选项给吓住了 ^@^啥是OpenGL ES? 

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。

看概念就很简单,就是嵌入式开发才会用到的Opengl.  开发桌面应用的同学可以心安地跳过啦:)

管线

        可以将opengl的整个系统通俗地理解为一部机器,更确切地比喻为一台流水线机器。在机器的源头,我们输入各类几何坐标数据、图像数据,在机器的终端(通常是显示屏),输出我们想要的三维模型。那么我们很自然地把opengl这台机器的处理流程想象成“管线”,管线种输入 的原材料经过管线上的每一个都要做一次处理,然后将处理结果再送往下一个节点。OpenGL 中有两种流水线,一种是固定流水线,另外一种则是可编程流水线。其中,OpenGL 1.0 版本支持固定流水线。从OpenGL 2.0版本开始,OpenGL支持可编程的流水线。也就是说,程序员可以通过Shader(一种程序)来控制GPU渲染的过程。

   

对于初学者,我们没有必要一开始就细致深入探究两种管线的差评,需要理解的是:可编程管线在处理流程上比固定管线更加灵活,在处理能力上,由于充分利用了图形计算卡(GPU或其它显卡)的计算资源比固定管线更为强大,可实现一些固定管线无法实现的特效(这对游戏和一些物理仿真很重要)。

Context(Profile)

什么是context? 

       OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。在OpenGL 3.0版本之前,OpenGL创建Context都是一致的,随着升级会新增一些内容(例如从OpenGL1.1升级到1.5,会新增一些状态变量或者属性,并添加一些设置这些内容的函数),整体上来说没有什么大的变化。但是从OpenGL 3.0开始,OpenGL为了摆脱历史的“包袱”,想要彻底的废弃掉之前的许多特性,但是无奈市面上已经有大量依赖OpenGL之前版本的代码,导致OpenGL维护小组的这一想法难以付诸实施,于是在OpenGL 3.1开始引入了OpenGL Context的一些分类,比如引入了CoreProfile等概念,之后随着版本发展到3.3,一切算是确定下来。正是由于OpenGL的这一变化过程以及其间引入的各种概念,导致初学者学习OpenGL时非常的痛苦,本来OpenGL API对于一般开发者来说就是晦涩难懂,如今还引入这些内容真的是令开发者压力山大。

在OpenGL 3.0版本之前,所有的OpenGL Context是统一的,都是一种兼容之前版本的模式(例如使用OpenGL 1.1编写的代码,在支持OpenGL 2.1的设备上可以正常的运行)。这些版本的OpenGL API也被称之为固定管线(相比较之后引入shader的可编程管线来说), 但是从3.0开始有了变化:

1、 OpenGL 3.0 引入了废弃机制,标记了许多OpenGL的函数是废弃的(但是3.0并没有真正移除它们,也就是说3.0版本仍然是一个可以向后兼容的Context)2、 OpenGL 3.1发布删除了之前3.0标记的过时函数(固定管线相关的函数),但是为了之前的OpenGL代码可用, 引入了一个扩展ARB_compatibility,这个扩展可以让OpenGL 3.1支持之前的OpenGL固定管线的内容。3、在OpenGL 3.2中正式引入了模式的概念(Profile),模式就将二者分离开来了。OpenGL 3.2 中模式包括:

Core Profile 只包含最新的Shader相关的函数,程序必须使用Shader编写。

compatibility Profile 可以兼容之前的OpenGL固定管线的内容,也可以使用Core Profile中的内容这样分开之后,开发者可以显式的要求创建某一种Profile来使用。

ARB

       SGI发起成立了“OpenGL架构委员会”(OpenGL Architecture Review Board,简称ARB)来共同管理和推广这项先进的标准,OpenGL后继标准的制定权也逐渐转移给ARB组织。在ARB内部,产生新标准的过程非常民主化:各成员以投票的方式来决定新版OpenGL标准应具有的功能特性,并据投票结果制作正式标准文档,各软硬件厂商再根据这份标准文档的内容在自己的系统上实现;而所有的OpenGL版本都必须通过文档规定的全部测试项目方能生效。ARB组织的成员都非泛泛之辈,其核心成员包括SGI、3Dlabs、Intel、IBM、nVIDIA、ATi、Microsoft、Apple等业界领袖。

       不清楚这个名词的来历,并不会阻碍你编程,但是翻看其它人写的开源代码(例如OSG等)会发现很多函数都使用了以ARB为前缀的扩展API, 心中难免会疑惑,(这是个什么鬼)。了解这个概念后心中了然:这就是ARB构建委员会认可的一个扩展(经过大佬们认定的扩展,很可能在下一版本的升级中会收录到core profile哦 :)

EGL 什么是 EGL?

EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。EGL提供如下机制:

与设备的原生窗口系统通信查询绘图表面的可用类型和配置创建绘图表面在OpenGL ES 和其他图形渲染API之间同步渲染管理纹理贴图等渲染资源

为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。

使用 EGL 绘图的基本步骤

Display(EGLDisplay) 是对实际显示设备的抽象。Surface(EGLSurface)是对用来存储图像的内存区域FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer。Context (EGLContext) 存储 OpenGL ES绘图的一些状态信息。

使用EGL的绘图的一般步骤:

获取 EGL Display 对象:eglGetDisplay()初始化与 EGLDisplay 之间的连接:eglInitialize()获取 EGLConfig 对象:eglChooseConfig()创建 EGLContext 实例:eglCreateContext()创建 EGLSurface 实例:eglCreateWindowSurface()连接 EGLContext 和 EGLSurface:eglMakeCurrent()使用 OpenGL ES API 绘制图形:gl_*()切换 front buffer 和 back buffer 送显:eglSwapBuffer()断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease()删除 EGLSurface 对象删除 EGLContext 对象终止与 EGLDisplay 之间的连接

OpenGL ES 和 EGL 的联系

 

一个类比的例子

我们来思考一下画家绘画的过程:首先要有一名懂得各种绘画技艺的画家,然后他需要一张画布,一些笔,一些颜料,一些辅助工具(尺、模板、橡皮、调色板等等),然后他在画布上绘制第一幅画,完成之后展示给人们看;在人们观赏第一幅画的时候,他可以在第二张画布上绘制第二幅画,绘制完成后收回第一幅画,将第二幅画展现给人们看;接着使用工具擦除第一幅画,在同一张画布上绘制第三幅画;周而复始,人们便看到了一幅接一幅的画。

对比 OpenGL ES/EGL,各要素的对应关系大体如下:

画家:编程人员

笔、颜料、辅助工具:OpenGL ES API

画布:EGL 创建的 Surface

所以计算机绘画的本质就是选择图像显示的像素格式,申请一块内存(画布),填充像素(颜色),绘制完成之后,通知计算机显示到屏幕上(按比例发射RGB光),最终就看到了所绘制的画面。之所以要先选择像素格式,是因为无论是所申请内存的大小,还是硬件驱动解析这块内存的方式,都是由像素格式决定的。

to be continue 缓冲区(Buffers)

OpenGL 中主要有 3 种 Buffer:

帧缓冲区(Frame Buffers) 帧缓冲区:这个是存储OpenGL 最终渲染输出结果的地方,它是一个包含多个图像的集合,例如颜色图像、深度图像、模板图像等。渲染缓冲区(Render Buffers) 渲染缓冲区:渲染缓冲区就是一个图像,它是 Frame Buffer 的一个子集。缓冲区对象(Buffer Objects) 缓冲区对象就是程序员输入到 OpenGL 的数据,分为结构类和索引类的。前者被称为“数组缓冲区对象”或“顶点缓冲区对象”(“Array Buffer Object”或“Vertex Buff er Object”),即用来描述模型的数组,如顶点数组、纹理数组等; 后者被称为“索引缓冲区对象”(“Index Buffer Object”),是对上述数组的索引。 GLSL

GLSL 是 OpenGL 的编程语言,全称 OpenGL Shader Language,它的语法类似于 C 语言。上面介绍管道概念的时候,我们提到可编程管线可以利用图形计算卡的计算资源,而GLSL正是程序开发者与图形计算卡进行交互的语言。

着色器程序(Shader)

Shader 是用GLSL编写的一段程序,在图形计算卡上执行。用来描述如何绘制(渲染),OpenGL 渲染需要两种 必须的Shader:Vertex Shader 和 Fragment Shader,现在新版本的OPENGL又添加了compute Shadre 和其它几个非必须的Shader,这个我们后面在来学习。

顶点着色器(Vertex Shader) 对于3D模型网格的每个顶点执行一次,主要是确定该顶点的最终位置。片元着色器(Fragment Shader) 对光栅化之后2D图像中的每个像素处理一次。3D物体的表面最终显示成什么样将由它决定,例如为模型的可见表面添加纹理,处理光照、阴影的影响等等。 图元(Primitives)

在 OpenGL 的世界里,我们只能画点、线、三角形这三种基本图形,而其它复杂的图形都可以通过三角形来组成。所以这里的图元指的就是这三种基础图形:

点:点存在于三维空间,坐标用(x,y,z)表示。线:由两个三维空间中的点组成。三角形:由三个三维空间的点组成。 光栅化(Rasterize)

在介绍光栅化之前,首先来补充 OpenGL 中的两个非常重要的概念:

顶点(Vertex) 就是图形中顶点,一系列的顶点就围成了一个图形。片元(Fragment) 是三维空间的点、线、三角形这些基本图元映射到二维平面上的映射区域,通常一个 Fragment 对应于屏幕上的一个像素,但高分辨率的屏幕可能会用多个像素点映射到一个 Fragment,以减少 GPU 的工作。

而光栅化是把点、线、三角形映射到屏幕上的像素点的过程。

坐标系


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3